/**
 * 安全配置验证模块
 * EndoSight-UC 医疗AI系统 - P0级安全修复
 *
 * 在启动时验证所有安全配置，确保系统安全运行
 */

import winston from 'winston';

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.json()
  ),
  transports: [
    new winston.transports.Console({
      format: winston.format.simple()
    })
  ]
});

/**
 * 验证所有安全配置
 */
export const validateSecurityConfig = () => {
  const errors = [];
  const warnings = [];

  // P0-A: JWT密钥验证
  const jwtSecret = process.env.JWT_SECRET;
  if (!jwtSecret) {
    errors.push('JWT_SECRET 环境变量未设置');
  } else if (jwtSecret.length < 32) {
    errors.push('JWT_SECRET 长度不足32字符');
  } else if (jwtSecret === 'endo_sight_uc_secret_key_2024') {
    errors.push('JWT_SECRET 使用了不安全的默认值');
  } else if (/^[a-zA-Z0-9]+$/.test(jwtSecret)) {
    warnings.push('JWT_SECRET 建议使用更复杂的字符组合');
  }

  // P0-D: API密钥验证
  const deepseekKey = process.env.DEEPSEEK_API_KEY;
  if (!deepseekKey) {
    warnings.push('DEEPSEEK_API_KEY 未设置，AI功能可能不可用');
  } else if (deepseekKey.length < 20) {
    errors.push('DEEPSEEK_API_KEY 长度不足');
  }

  // 端口配置验证
  const port = process.env.PORT;
  if (!port) {
    warnings.push('PORT 未设置，将使用默认端口4000');
  } else if (port < 1024) {
    warnings.push(`使用特权端口 ${port}，建议使用1024以上的端口`);
  }

  // 环境模式验证
  const nodeEnv = process.env.NODE_ENV;
  if (!nodeEnv) {
    warnings.push('NODE_ENV 未设置，默认为development模式');
  } else if (nodeEnv === 'production') {
    // 生产环境额外安全检查
    if (process.env.DEBUG_SHOW_ALL_TASKS === 'true') {
      errors.push('生产环境不能启用DEBUG_SHOW_ALL_TASKS');
    }
  }

  // 文件上传配置验证
  const uploadPath = process.env.UPLOAD_PATH;
  if (!uploadPath) {
    warnings.push('UPLOAD_PATH 未设置，将使用默认路径');
  } else if (uploadPath.includes('..')) {
    errors.push('UPLOAD_PATH 包含路径遍历字符');
  }

  const maxFileSize = parseInt(process.env.MAX_FILE_SIZE);
  if (!maxFileSize || maxFileSize > 50 * 1024 * 1024) {
    warnings.push('MAX_FILE_SIZE 未设置或过大，建议限制在50MB以内');
  }

  // 数据库配置安全检查
  const dbPassword = process.env.DB_PASSWORD;
  if (nodeEnv === 'production' && (!dbPassword || dbPassword.length < 8)) {
    errors.push('生产环境数据库密码必须设置且长度不少于8字符');
  }

  // JWT过期时间验证
  const jwtExpiresIn = process.env.JWT_EXPIRES_IN;
  if (jwtExpiresIn) {
    const match = jwtExpiresIn.match(/^(\d+)([smhd])$/);
    if (match) {
      const value = parseInt(match[1]);
      const unit = match[2];

      // 转换为小时
      let hours = 0;
      switch (unit) {
        case 's': hours = value / 3600; break;
        case 'm': hours = value / 60; break;
        case 'h': hours = value; break;
        case 'd': hours = value * 24; break;
      }

      if (hours > 24) {
        warnings.push('JWT过期时间过长，建议不超过24小时');
      } else if (hours < 0.5) {
        warnings.push('JWT过期时间过短，可能影响用户体验');
      }
    } else {
      warnings.push('JWT_EXPIRES_IN 格式无效，应为数字+单位(s/m/h/d)');
    }
  }

  // 生成验证报告
  const report = {
    timestamp: new Date().toISOString(),
    status: errors.length > 0 ? 'FAILED' : 'PASSED',
    errors,
    warnings,
    summary: {
      totalErrors: errors.length,
      totalWarnings: warnings.length,
      isSecure: errors.length === 0
    }
  };

  // 记录验证结果
  if (errors.length > 0) {
    logger.error('🚨 安全配置验证失败:', report);

    // 在开发环境显示详细错误
    if (nodeEnv !== 'production') {
      console.error('\n🚨🚨🚨 安全配置验证失败 🚨🚨🚨');
      console.error('发现以下安全配置问题:');
      errors.forEach((error, index) => {
        console.error(`  ${index + 1}. ${error}`);
      });
      console.error('\n请修复这些问题后重新启动服务器。\n');
    }
  } else {
    logger.info('✅ 安全配置验证通过:', report);

    if (warnings.length > 0) {
      logger.warn('⚠️ 安全配置警告:', warnings);

      if (nodeEnv !== 'production') {
        console.log('\n⚠️ 安全配置警告:');
        warnings.forEach((warning, index) => {
          console.log(`  ${index + 1}. ${warning}`);
        });
        console.log('\n建议在生产环境部署前处理这些警告。\n');
      }
    }
  }

  return report;
};

/**
 * 安全启动检查
 * 如果存在严重安全配置错误，将终止进程
 */
export const securityStartupCheck = () => {
  const report = validateSecurityConfig();

  // 如果有致命错误，停止服务器启动
  if (report.status === 'FAILED') {
    console.error('\n💀 服务器启动被阻止：发现严重安全配置问题！');
    console.error('请修复上述安全问题后重新启动。\n');
    process.exit(1);
  }

  return report;
};

/**
 * 获取当前安全状态
 */
export const getSecurityStatus = () => {
  const config = validateSecurityConfig();

  return {
    status: config.status,
    isSecure: config.summary.isSecure,
    lastChecked: config.timestamp,
    errors: config.errors,
    warnings: config.warnings,
    recommendations: generateSecurityRecommendations(config)
  };
};

/**
 * 生成安全建议
 */
const generateSecurityRecommendations = (config) => {
  const recommendations = [];

  if (config.errors.length > 0) {
    recommendations.push({
      priority: 'HIGH',
      category: 'critical',
      message: '立即修复所有安全配置错误'
    });
  }

  if (config.warnings.length > 0) {
    recommendations.push({
      priority: 'MEDIUM',
      category: 'improvement',
      message: '考虑处理安全配置警告以提高系统安全性'
    });
  }

  // 通用安全建议
  recommendations.push(
    {
      priority: 'LOW',
      category: 'maintenance',
      message: '定期轮换JWT密钥和API密钥'
    },
    {
      priority: 'LOW',
      category: 'monitoring',
      message: '启用安全事件监控和日志记录'
    },
    {
      priority: 'LOW',
      category: 'backup',
      message: '定期备份配置文件和密钥'
    }
  );

  return recommendations;
};

export default {
  validateSecurityConfig,
  securityStartupCheck,
  getSecurityStatus
};